Заданий вираз:
X=A2*B1+C4/(K-E1*F1) K=10974759
Згідно з завданням, головний модуль повинен містити попереднє визначення зовнішніх процедур та їх виклик. Оскільки жодних дій у ньому не відбувається, то сегмент даних буде містити лише прапорець помилки, яка може виникнути в одній з процедур. Він потрібен для коректного завершення програми.
; main.asm головна програма
EXTRN Input :FAR, Calculation :FAR, Output :FAR
PUBLIC erFlag
STACKSG SEGMENT PARA STACK 'Stack'
DW 127 DUP(0)
STACKSG ENDS
DATASG SEGMENT PARA PUBLIC 'Data'
erFlag DB 0
DATASG ENDS
CODESG SEGMENT PARA PUBLIC 'Code'
main:
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
MOV AX,DATASG
MOV DS,AX
CALL Input
cmp erFlag,0
jne A30
CALL Calculation
cmp erFlag,0
jne A30
CALL Output
cmp erFlag,0
jne A30
A30:
mov ah,4Ch
int 21h
CODESG ENDS
END main
В модулі Input міститься оголошення зовнішньої змінної erFlag та загальнодоступних змінних B,C,D,E,F, що є визначені в сегменті даних даного модуля. Крім того, сама процедура Input оголошується як FAR та PUBLIC, що дає змогу викликати її з головної програми. Сегмент коду містить, також, опис локальних процедур, необхідних для функціонування модуля - input_variable та CHECK_BYTE та макрокоманду множення MY_MUL. Вони директив доступності (PUBLIC) не мають. Сегмент даних містить повідомлення та змінні необхідні лише для вводу даних ти їх перетворення в шістнадцяткову форму.
erFlag – змінна, що містить ознаку помилки. В даному модулі вона формується у разі некоректно введеного символу, або якщо введене значення не відповідає діапазону.
;Input.asm модуль вводу даних
EXTRN erFlag:BYTE
PUBLIC B,C,D,E,F
MY_MUL MACRO X,Y,Z
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
DATASG SEGMENT PARA PUBLIC 'Data'
A dw 00h
B db 00h
C dd 00h
E db 00h
F db 00h
X_Str db 10 dup (0)
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
Mult10 dw 1,0
my_z dw 0,0
MESSG_X DB 13,10,'X=A2*B1+C4/(K-E1*F1) K=10974759 (A77627h)','$'
MESSG_A DB 13,10,'A= ','$'
MESSG_B DB 13,10,'B= ','$'
MESSG_C DB 13,10,'C= ','$'
MESSG_E DB 13,10,'E= ','$'
MESSG_F DB 13,10,'F= ','$'
MESSG_X1 DB 13,10,'X= ','$'
erStr1 db 13,10,'Data not input_variable',13,10,'$'
erStr2 db 13,10,'Incorrectly data ',13,10,'$'
erStr2_1 db 13,10,' D =0 --> divide by zero ',13,10,'$'
erStr3 db 13,10,'Data is too long ',13,10,'$'
DATASG ENDS
CODESG SEGMENT PARA PUBLIC 'CODE'
ASSUME DS:DATASG, CS:CODESG
input proc FAR
public Input
LEA DX,MESSG_X
MOV AH,09
INT 21H
LEA DX,MESSG_A
MOV AH,09
INT 21H
mov di,offset A
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_E
MOV AH,09
INT 21H
mov di,offset E
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_F
MOV AH,09
INT 21H
mov di,offset F
mov MaxLen,3
mov cx,MaxLen
call input_variable
ret
input endp
input_variable PROC
mov si,0
In_00: mov ah,01
int 21h
cmp al,0Dh
je In_1
In_0: mov dl,al
call CHECK_BYTE
mov TempStr[si],dl
inc si
loop In_00
In_1: push si
dec si
cmp cx,MaxLen
jne In_2
call Err1
In_2: mov bh,0
mov bl,TempStr[si]
MY_MUL Mult10,bx,my_z
add TempBin,ax
adc TempBin+2,dx
mov bh,0
mov bl,10
MY_MUL Mult10,bx,my_z
mov Mult10,ax
...